package com.market.controller.admin;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.market.constants.ResultCode;
import com.market.entity.SystemRole;
import com.market.entity.SystemUser;
import com.market.exception.ServiceException;
import com.market.model.dto.SystemRoleCreateDto;
import com.market.model.dto.SystemRolePageDto;
import com.market.model.dto.SystemRoleUpdateDto;
import com.market.service.SystemRoleService;
import com.market.service.SystemUserService;
import com.market.model.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 系统角色管理控制器
 * 提供系统角色的管理功能，包括创建角色、删除角色、更新角色信息、分页查询角色列表和获取所有角色列表
 * 所有接口需要用户登录且具有系统管理员角色权限
 * @author zhangyihua
 * @version 1.0
 * @date 2024/2/19 20:20
 */
@RestController
@RequestMapping("/admin/role")
@SaCheckLogin
@SaCheckRole(value = {"system"})
public class SystemRoleAdminController {
  @Autowired
  private SystemRoleService systemRoleService;
  @Autowired
  private SystemUserService systemUserService;
  
  /**
   * 创建系统角色
   * 需要提供角色名称和角色编码
   * @param dto 包含角色信息的数据传输对象
   * @return 操作结果
   */
  @PostMapping
  public R create(@RequestBody SystemRoleCreateDto dto) {
    if (StrUtil.isEmpty(dto.getRoleName()) || StrUtil.isEmpty(dto.getRoleCode()))
      throw new ServiceException(ResultCode.ValidateError);
    SystemRole systemRole = BeanUtil.toBean(dto, SystemRole.class);
    systemRole.setCreateTime(new Date().getTime());
    systemRole.setUpdateTime(new Date().getTime());
    boolean save = systemRoleService.save(systemRole);
    if (!save)
      throw new ServiceException(ResultCode.SaveError);
    return R.ok();
  }
  
  /**
   * 删除系统角色
   * 检查是否有用户使用此角色，如有则不允许删除
   * @param id 角色ID
   * @return 操作结果
   */
  @DeleteMapping
  public R del(String id) {
    Long count = systemUserService.lambdaQuery().eq(SystemUser::getRoleId, id).count();
    if(count >0) throw new ServiceException(ResultCode.DeleteError,"存在此角色用户，不可删除");
    boolean result = systemRoleService.removeById(id);
    if (!result) throw new ServiceException(ResultCode.DeleteError);
    return R.ok();
  }
  
  /**
   * 更新系统角色信息
   * @param dto 包含需更新角色信息的数据传输对象
   * @return 操作结果
   */
  @PutMapping
  public R updateRole(@RequestBody SystemRoleUpdateDto dto){
    if(StrUtil.isEmpty(dto.getId())) throw new ServiceException(ResultCode.ValidateError);
    SystemRole systemRole = BeanUtil.toBean(dto, SystemRole.class);
    boolean update = systemRoleService.updateById(systemRole);
    if (!update) throw new ServiceException(ResultCode.UpdateError);
    return R.ok();
  }
  
  /**
   * 分页获取系统角色列表
   * 支持按条件筛选角色
   * @param rolePageDto 角色分页查询参数
   * @return 返回分页的角色列表
   */
  @GetMapping("/page")
  public R<Page> getRolePageList(SystemRolePageDto rolePageDto) {
    Page page = systemRoleService.getRolePageList(rolePageDto);
    return R.ok(page);
  }
  
  /**
   * 获取所有系统角色列表
   * @return 返回所有角色的列表
   */
  @GetMapping("/list")
  public R<List<SystemRole>> getRoleList(){
    List<SystemRole> list = systemRoleService.lambdaQuery().list();
    return R.ok(list);
  }
}
